EP20. 모델을 진짜로 학습시키고 운영하기(끝)
LLM 을 학습시키는 하이퍼파라미터·데이터셋·도구 선택부터, 지식 증류와 vLLM 기반 추론 최적화까지 운영 단계 전반의 의사결정을 정리합니다.
0. 사전 필수 용어 (선행지식)
본 회차를 따라가려면 다음 5개 개념의 사전 이해가 필요합니다. 깊은 보강이 필요하면 AI 엔지니어링 EP0 - 선수지식 또는 Hugging Face Course 를 참고하세요.
- SFT (Supervised Fine-Tuning): 입력·정답 쌍의 라벨 데이터로 사전학습된 LLM 을 추가 학습시키는 기법. "정답이 적힌 문제집을 다시 풀게 하는 과외" 와 비슷합니다. §4 의 도구 사용·추론 데이터셋 학습에서 사용됩니다.
- LoRA (Low-Rank Adaptation): 모델 전체 파라미터 대신 작은 어댑터 행렬만 학습해 메모리·시간을 절감하는 PEFT 기법. "큰 책에 포스트잇만 붙여 수정하는 방식" 입니다. §4 Step 3 의 Llama Factory 가 자동 적용합니다.
- 로짓·확률 분포 (Logits / Softmax): 모델이 다음 토큰을 예측할 때 어휘 전체에 대해 매기는 점수와, 그것을 softmax 로 정규화한 확률값. "객관식 문제에서 모든 보기에 매긴 자신감 점수" 입니다. §4 Step 4 의 지식 증류 핵심입니다.
- KV 캐시 (Key-Value Cache): Transformer 가 이전 토큰의 key·value 벡터를 메모리에 저장해 두고 재계산을 피하는 추론 최적화 자료구조. "이미 푼 문제의 풀이 과정을 메모해 두는 노트" 와 같습니다. §4 Step 5 의 vLLM Paged Attention 이 효율적으로 관리합니다.
- 양자화 (Quantization): 모델 가중치를 FP16/FP32 에서 INT8/INT4 같은 낮은 정밀도로 변환해 메모리·연산을 줄이는 압축 기법. "고해상도 사진을 압축해 용량을 줄이는 것" 과 유사하며 약간의 품질 손실을 감수합니다. §9 한계에서 트레이드오프를 다룹니다.
📚 참고: 더 깊은 정의는 Hugging Face — PEFT/LoRA, vLLM Paged Attention 논문, Anthropic — Tokenization.
1. 주제 정의
모델을 진짜로 학습시키고 운영하기(끝) 은 사전학습된 LLM 에 도메인 특화 능력(도구 사용·추론 등)을 SFT 로 추가하고, 학습된 모델을 vLLM·양자화·캐싱 같은 기법으로 운영 비용을 낮춰 서비스하는 일련의 파이프라인입니다.
핵심 아이디어: "학습은 데이터가 특별해야 하고, 운영은 인퍼런스를 안 하는 게 가장 싸다."
2. 풀려는 문제
실무에서 LLM 을 직접 학습·운영할 때 마주치는 4가지 문제:
- 문제 1 (학습 효율): GPU 메모리가 작으면 큰 배치를 못 쓰고, 데이터셋이 작으면 학습이 충분히 각인되지 않습니다. 하이퍼파라미터 잘못 잡으면 며칠 GPU 가 낭비됩니다.
- 문제 2 (특수 기능 학습): 도구 호출(tool use)·체인 오브 쏘트(reasoning) 같은 기능은 일반 인스트럭션 데이터로는 학습되지 않습니다. 데이터셋 구조 자체가 달라야 합니다.
- 문제 3 (인퍼런스 비용): 큰 모델을 매 요청마다 호출하면 토큰당 비용·GPU 시간이 빠르게 누적됩니다. 사용자 1만 명이 하루에 한 번씩만 호출해도 월 단위 청구서가 폭증합니다.
- 문제 4 (운영 안정성): Ollama 같은 개발 도구를 그대로 프로덕션에 쓰면 동시 요청 처리량(throughput)이 부족합니다. 큐가 쌓이고 응답이 느려집니다.
💡 실무 노하우: 4가지 중 가장 ROI 가 높은 것은 문제 3 (인퍼런스 비용) 입니다. UI/UX 수정만으로도 호출 횟수가 30~50% 줄어드는 경우가 흔하고, 모델 학습보다 훨씬 빠르게 효과가 나타납니다.
3. 핵심 개념·구조
본 회차는 다음 5개 축으로 구성됩니다:
- 하이퍼파라미터: 학습률·배치 사이즈·에포크·그레디언트 누적
- 특수 데이터셋: 도구 사용 (
tool_use/tool_result메시지)·추론 (<think>태그) - 튜닝 도구: Llama Factory(설치형 UI), Hugging Face AutoTrain(서비스형), H2O LLM Studio
- 지식 증류: 선생님 모델(큰)→학생 모델(작은) 확률 분포 전이, 보케블러리 매핑, Top-K 로짓
- 추론 최적화: UI/UX 우회, vLLM Paged Attention, 양자화, KV 캐시, Flash Attention, Prefix Cache
[ 데이터셋 구축 ] → [ SFT/LoRA 학습 ] → [ 증류로 경량화 ] → [ vLLM 배포 ] → [ 캐싱·UI 우회 ]
tool_use/think Llama Factory Top-K logits Paged Attn Prefix Cache
4. 구현 가이드 (Do It Yourself)
시작 전 (Before you begin)
이 섹션을 완료하면 SFT 데이터셋을 직접 만들고, Llama Factory 로 파인튜닝하고, vLLM 으로 추론 서버를 띄울 수 있습니다.
선수 조건:
- Python 3.10+, CUDA 12+ 호환 GPU (VRAM ≥ 16GB 권장)
- pip install vllm transformers datasets
- Docker (Llama Factory 설치형 사용 시)
- Hugging Face 계정 (오픈소스 데이터셋 다운로드용)
소요 시간: 약 45분 (학습 시간 제외).
Step 1 — 도구 사용(Tool Use) SFT 데이터셋 한 행 구성
목표: tool use SFT 학습에 필요한 메시지 구조를 코드로 표현합니다.
다음 코드를 dataset_tool_use.py 에 추가합니다.
sample = {
"messages": [
{"role": "system", "content": "You are a helpful assistant. You have access to: get_delivery_status(order_id)"},
{"role": "user", "content": "주문 123 배송 어디?"},
{"role": "assistant", "tool_use": {"name": "get_delivery_status", "args": {"order_id": "123"}}},
{"role": "tool", "tool_result": {"status": "배송중", "eta": "내일"}},
{"role": "assistant", "content": "주문 123은 배송중이며 내일 도착 예정입니다."}
]
}
이 코드는 단일 학습 행을 정의합니다. system 에 사용 가능한 툴을 명시하고, assistant.tool_use → tool.tool_result → 최종 assistant.content 까지 한 턴에 담아야 모델이 호출 흐름 자체를 학습합니다.
⚠️ 주의:
tool_use·tool_result키는 모델·프레임워크마다 명칭이 다릅니다. Anthropic 은tool_use/tool_result, OpenAI 는tool_calls/role: tool. 학습 대상 모델의 chat template 형식에 맞춰 변환하세요.💡 실무 노하우: 1행만 만들지 말고 같은 툴에 대해 10~50 개의 다양한 사용자 발화를 만드는 게 효과적입니다. 데이터 다양성 < 충분량 < 품질 순으로 영향이 큽니다.
📚 참고: Anthropic Tool Use 가이드, LangChain Tools 의 chat template 변환 코드.
✅ 확인: Step 1 완료. JSON 직렬화가 되고, role 이 system→user→assistant→tool→assistant 순으로 흐릅니다.
Step 2 — 추론(Reasoning) SFT 데이터셋 행 구성
목표: <think> 태그 패턴으로 추론 능력을 학습시키는 데이터를 만듭니다.
다음 코드를 dataset_reasoning.py 에 추가합니다.
reasoning_sample = {
"messages": [
{"role": "system", "content": "Answer step-by-step inside <think>...</think>, then give the final answer."},
{"role": "user", "content": "사과 3개에 1500원, 5개 사면?"},
{"role": "assistant", "content": "<think>1. 단가 = 1500/3 = 500원\n2. 5개 = 500*5 = 2500원</think>\n2500원입니다."}
]
}
이 코드는 모델이 답을 내기 전에 <think> 블록 안에서 단계별 사고를 펼치도록 강제합니다.
💡 실무 노하우:
<think>블록은 토큰을 많이 먹습니다. 운영 시 사용자에게 노출하지 않도록 응답 파서로 잘라내거나, hidden reasoning 을 지원하는 추론 모델(o1·Claude extended thinking) 을 사용하세요.📚 참고: DeepSeek-R1 데이터셋 Hugging Face 검색, OpenAI Cookbook — Reasoning.
✅ 확인: Step 2 완료. <think>...</think> 가 응답 앞부분에 있고, 그 뒤에 사용자 노출용 최종 답이 따라옵니다.
Step 3 — Llama Factory 로 LoRA 파인튜닝 실행
목표: 도커 한 줄로 학습 환경을 띄우고 웹 UI 에서 학습을 시작합니다.
docker run --gpus all -p 7860:7860 \
-v ./data:/app/data \
hiyouga/llamafactory:latest
이 명령은 Llama Factory 컨테이너를 띄우고 http://localhost:7860 에서 웹 UI 를 엽니다. UI 에서 모델·데이터셋·학습 방법(LoRA/QLoRA)을 선택하면 모델 아키텍처에 맞춰 어댑터가 자동 부착됩니다.
⚠️ 주의:
--gpus all이 동작하려면 NVIDIA Container Toolkit 이 설치되어 있어야 합니다. 미설치 시 CPU 로 fallback 되지 않고 즉시 실패합니다.💡 실무 노하우: 배치 사이즈가 GPU OOM 으로 작아질 수밖에 없을 땐 그레디언트 누적(
gradient_accumulation_steps) 을 4~16 으로 늘려 효과적 배치를 키우세요. 작은 데이터셋(<1만 행) 일수록 에포크를 3~10 으로 크게 잡아야 각인됩니다.📚 참고: Llama Factory GitHub (stars 30K+), Hugging Face AutoTrain (서비스형 대안).
✅ 확인: Step 3 완료. 브라우저에서 7860 포트가 열리고, Train 탭에서 모델 목록이 보입니다.
Step 4 — 지식 증류용 Top-K 로짓 추출
목표: 선생님 모델의 응답 확률 분포 중 상위 K 개만 저장해 학생 모델 학습 데이터로 만듭니다.
다음 코드를 distill_topk.py 에 추가합니다.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
teacher = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-70B")
tok = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-70B")
inputs = tok("질문 텍스트", return_tensors="pt").to(teacher.device)
with torch.no_grad():
logits = teacher(**inputs).logits[:, -1, :]
topk = torch.topk(torch.softmax(logits, dim=-1), k=20)
distill_row = {"token_ids": topk.indices.tolist(), "probs": topk.values.tolist()}
이 코드는 마지막 위치의 분포에서 상위 20개 토큰과 확률만 추출해 디스크에 저장 가능한 형태로 만듭니다.
⚠️ 주의: 선생님 모델과 학생 모델의 보케블러리(vocabulary) 가 다르면 token id 매핑이 필요합니다. 보케블러리가 동일한 동일 계열(예: Llama-3.1-70B → Llama-3.1-8B) 끼리만 증류 효과가 안정적입니다.
💡 실무 노하우: 전체 분포 대신 Top-K 만 쓰면 저장 용량과 학습 비용이 1/N 로 줄지만 거의 같은 효과를 냅니다. 현실에서 많이 쓰이는 또다른 방식은 선생님 응답을 모은 합성 SFT 데이터셋 이고, 로짓 학습보다 훨씬 저렴합니다.
📚 참고: HuggingFace TRL — Distillation, Hinton et al. 2015 KD 원논문.
✅ 확인: Step 4 완료. distill_row["probs"] 의 합이 약 0.6~0.95 (Top-20 누적 확률) 사이입니다.
Step 5 — vLLM 추론 서버 띄우기
목표: Paged Attention 으로 동시 요청 처리량을 극대화한 운영용 추론 서버를 가동합니다.
vllm serve meta-llama/Llama-3.1-8B-Instruct \
--quantization awq \
--kv-cache-dtype fp8 \
--enable-prefix-caching \
--max-model-len 8192
이 명령은 AWQ 양자화 모델을 로드하고, KV 캐시를 FP8 로 저장해 메모리 효율을 높이고, 프리픽스 캐시를 켜 반복되는 프롬프트 앞부분의 재계산을 생략합니다.
💡 실무 노하우:
--enable-prefix-caching은 시스템 프롬프트가 길고 동일할 때 효과가 큽니다. 사용자 메시지가 짧고 시스템이 5KB+ 이면 토큰 비용이 절반 이하로 떨어지는 경우가 많습니다.📚 참고: vLLM 공식 docs, vLLM GitHub (stars 30K+).
✅ 확인: Step 5 완료. curl http://localhost:8000/v1/models 에 모델 목록이 응답합니다.
Step 마지막 — 동작 확인 (테스트)
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "meta-llama/Llama-3.1-8B-Instruct",
"messages": [{"role": "user", "content": "안녕"}]}'
예상 출력:
{"id":"chatcmpl-...","choices":[{"message":{"role":"assistant",
"content":"안녕하세요! 무엇을 도와드릴까요?"}}],"usage":{...}}
5. 적용 사례 (공신력 오픈소스)
- vLLM (
https://github.com/vllm-project/vllm) — Paged Attention·Prefix Cache. UC Berkeley 발 프로덕션 추론 표준. - Hugging Face Transformers (
https://github.com/huggingface/transformers) — 토크나이저·모델 로딩·로짓 추출. - Ollama (
https://github.com/ollama/ollama) — 로컬 개발용 추론 (운영 서비스 X). - LiteLLM (
https://github.com/BerriAI/litellm) — 여러 LLM 프로바이더 라우팅·rate limit·캐싱 통합. - LangChain (
https://github.com/langchain-ai/langchain) — 도구 호출·체인 패턴. - LangChain4j (
https://github.com/langchain4j/langchain4j) — JVM 환경 도구 호출. - Anthropic Python SDK (
https://github.com/anthropics/anthropic-sdk-python) —tool_use/tool_resultAPI. - OpenAI Python SDK (
https://github.com/openai/openai-python) —tool_callsAPI. - Llama Factory (
https://github.com/hiyouga/LLaMA-Factory) — 웹 UI 기반 SFT·LoRA. - HuggingFace TRL (
https://github.com/huggingface/trl) — DPO·SFT·증류 학습 라이브러리.
📚 참고: 위 OSS 들은 모두 GitHub stars 5K+ 또는 Anthropic·OpenAI·Meta 공식 SDK 입니다.
💡 실무 노하우: 도구 호출 인터페이스는 LangChain 추상화를 거치기보다 Anthropic/OpenAI 공식 SDK 를 직접 호출하는 게 디버깅과 latency 면에서 유리합니다. 추상화는 마이그레이션 비용을 늘립니다.
6. 핵심 원리
- "학습은 데이터가 특별하다": 알고리즘(SFT/DPO)은 같고, 도구 사용·추론 능력은 데이터셋의 구조(role·tool_use·
<think>) 가 결정합니다. - "가장 싼 인퍼런스는 안 부르는 인퍼런스": UI/UX 로 모델 호출을 우회하거나, 캐시·알고리즘으로 대체하는 것이 양자화·증류보다 효과가 큽니다.
7. 변형·확장
- DPO/ORPO 선호 학습: SFT 외에 인간 선호(채택/거절 쌍) 로 미세 정렬.
- QLoRA: 4bit 양자화 + LoRA. 24GB VRAM 으로 70B 학습 가능.
- 합성 데이터 증류: 로짓 대신 선생님 응답을 모은 데이터셋으로 SFT.
- MCP (Model Context Protocol): 도구를 모델에 학습시키는 대신 표준 프로토콜로 외부 도구 연결 (2026 기준 Anthropic 발 표준).
8. 다른 도구·접근과의 비교 (3-way)
| 항목 | Llama Factory | Hugging Face AutoTrain | H2O LLM Studio |
|---|---|---|---|
| 형태 | 설치형 (Docker) | 서비스형 (클라우드) | 설치형 (Docker Compose) |
| 진입 장벽 | 낮음 (도커 한 줄) | 가장 낮음 (UI 만) | 중간 (YAML 작성) |
| 비용 | 자기 GPU | 사용량 과금 | 자기 GPU |
| 커스터마이징 | 높음 | 낮음 | 매우 높음 |
| 권장 사용자 | 자기 GPU 가진 개인·팀 | 빠른 PoC | 고급 사용자 |
9. 한계·트레이드오프
- 양자화 품질 손실: INT4/AWQ 는 메모리는 줄지만 응답 품질이 미세하게 떨어집니다. 보통 1~3% MMLU 하락, 영역에 따라 더 큰 경우도 있어 평가 데이터셋으로 검증해야 합니다.
- 증류는 보케블러리 의존: 선생님·학생 토큰이 다르면 매퍼·차원 변환 로직이 필요하고, 결과 품질도 보장이 어렵습니다. 대부분 합성 SFT 로 대체됩니다.
- vLLM 은 학습 X: vLLM 은 추론 전용입니다. 학습은 transformers+TRL+DeepSpeed/FSDP 로, 추론은 vLLM 으로 역할을 분리합니다.
- Prefix Cache 는 변동 프롬프트에 무력: 사용자별로 다이내믹하게 시스템 프롬프트가 바뀌면 캐시가 적중하지 않습니다. 시스템 부분과 가변 부분의 순서를 신중히 설계해야 합니다.
10. 최신 권장 패턴 (2026+)
- Structured Output: OpenAI
response_formatJSON schema, Anthropictool_use강제로 파싱 실패율 0 에 가깝게. - MCP (Model Context Protocol): 도구를 학습시키지 말고 표준 프로토콜로 외부에서 주입. 학습 비용·재학습 빈도 ↓.
- Speculative Decoding: 작은 드래프트 모델로 후보 토큰을 예측, 큰 모델은 검증만 → 2~3배 가속 (vLLM 0.6+ 지원).
- Long-context KV 캐시 압축: H2O·SnapKV 같은 KV 캐시 압축으로 128K 컨텍스트도 단일 GPU 운영.
📚 참고 (2026-05 기준): Anthropic MCP 사양, vLLM speculative decoding 가이드.
11. 메타인지 자기평가
본인 LLM 시스템에 본 회차 내용을 적용 가능한지 검증합니다.
Step 1 — 현재 상태 점검
grep -r "openai.chat.completions.create\|anthropic.messages.create" --include="*.py"
grep -r "ollama" --include="*.py"
Step 2 — 적용 가능성 평가 - 월 LLM 청구서가 자기 시스템에서 가장 큰 비용 항목 Top 3 안에 들어간다. - 시스템 프롬프트 길이가 사용자 입력보다 5배 이상 길다 → Prefix Cache 효과 큼. - Ollama·LM Studio 로 프로덕션을 운영 중이다 → vLLM 으로 마이그레이션 필요. - 같은 사용자 의도가 자주 반복된다 → UI 우회·DB 검색 대체 가능.
Step 3 — 점진 적용 1. UI/UX 로 호출 자체를 줄일 수 있는 케이스 5건 식별 (영향 가장 큼). 2. 시스템 프롬프트 안정화 + Prefix Cache 켜기 (비용 30~50% ↓ 가능). 3. 양자화 모델로 교체 + 평가 데이터셋으로 품질 회귀 검증. 4. 특수 기능(도구·추론) 필요 시 SFT 데이터셋 100~1000행 부터 시작.
클릭하거나 Space를 눌러 뒤집기